package GOrden.mobile;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.MediaScannerConnection;
import android.media.MediaScannerConnection.MediaScannerConnectionClient;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.provider.MediaStore;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RadioButton;
import android.widget.Toast;

public class Camera extends Activity {
	/**
	 * Constantes para identificar la acci—n realizada (tomar una fotograf’a 
	 * o bien seleccionarla de la galer’a)
	 */
	private static int TAKE_PICTURE = 1;
	private static int SELECT_PICTURE = 2;
	
	public static final int MEDIA_TYPE_IMAGE = 1;
	public static final int MEDIA_TYPE_VIDEO = 2;
	
	private ProgressDialog progressDialog;
	private String ReceiveServer = "";
	private String orden;
	private boolean sendfile = false;
	private String _path="";
	
	private Uri fileUri;

	private final Handler progressHandler = new Handler() {

		public void handleMessage(Message msg) {
			if (msg.obj != null) {
				ReceiveServer = (String) msg.obj;
				ShowMensaje(ReceiveServer);
			}
			progressDialog.dismiss();
		}
	};
	
	/**
	 * Variable que define el nombre para el archivo donde escribiremos
	 * la fotograf’a de tama–o completo al tomarla.
	 */
	private String name = "";

    /** Este mŽtodo es llamado cuando la actividad es creada */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_foto);
        
        Bundle bn = getIntent().getExtras();
        this.orden = bn.getString("orden");  // Guardamos el numero de la orden de servicio
        
        name = Environment.getExternalStorageDirectory() + "/test.jpg";

        Button btnAction = (Button)findViewById(R.id.btnPic);
        btnAction.setOnClickListener(new OnClickListener() {       		
       		public void onClick(View v) {
       			/**
       			 * Obtenemos los botones de imagen completa y de galer’a para revisar su estatus
       			 * m‡s adelante
       			 */
       			RadioButton rbtnFull = (RadioButton)findViewById(R.id.radbtnFull);
       			RadioButton rbtnGallery = (RadioButton)findViewById(R.id.radbtnGall);
       			
       			/**
       			 * Para todos los casos es necesario un intent, si accesamos la c‡mara con la acci—n
       			 * ACTION_IMAGE_CAPTURE, si accesamos la galer’a con la acci—n ACTION_PICK. 
       			 * En el caso de la vista previa (thumbnail) no se necesita m‡s que el intent, 
       			 * el c—digo e iniciar la actividad. Por eso inicializamos las variables intent y
       			 * code con los valores necesarios para el caso del thumbnail, as’ si ese es el
       			 * bot—n seleccionado no validamos nada en un if. 
       			 */
       			Intent intent =  new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
       			int code = TAKE_PICTURE;
       			
       			/**
       			 * Si la opci—n seleccionada es fotograf’a completa, necesitamos un archivo donde
       			 * guardarla
       			 */
       			if (rbtnFull.isChecked()) {					
       				fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
       		    	intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
       			/**
       			 * Si la opci—n seleccionada es ir a la galer’a, el intent es diferente y el c—digo
       			 * tambiŽn, en la consecuencia de que estŽ chequeado el bot—n de la galer’a se hacen
       			 * esas asignaciones
       			 */       		    	
       			} else if (rbtnGallery.isChecked()){       				
       				intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI);
       				code = SELECT_PICTURE;
       			}
       			
       			/**
       			 * Luego, con todo preparado iniciamos la actividad correspondiente.
       			 */
       			startActivityForResult(intent, code);				
       		}
       	});   
        
        Button btnEnviar = (Button)findViewById(R.id.btnEnviarImage);
        btnEnviar.setOnClickListener(new OnClickListener() {       		
       		public void onClick(View v) {
       			if (sendfile) {  // Si se puede enviar el archivo
       				System.out.print(fileUri.getPath());
       				StoreImage(Camera.this);
       			}else {
       				Toast toast = Toast.makeText(getApplicationContext(), "Imagen no se puede enviar", Toast.LENGTH_LONG);
       				toast.show();
       			}
       			
       			
       		}
        });
    }
    
    /**
     * Funci—n que se ejecuta cuando concluye el intent en el que se solicita una imagen
     * ya sea de la c‡mara o de la galer’a
     */
    @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    	/**
    	 * Se revisa si la imagen viene de la c‡mara (TAKE_PICTURE) o de la galer’a (SELECT_PICTURE)
    	 */
    	if (requestCode == TAKE_PICTURE) {
    		/**
    		 * Si se reciben datos en el intent tenemos una vista previa (thumbnail)
    		 */
    		if (data != null) {
    			/**
    			 * En el caso de una vista previa, obtenemos el extra ÒdataÓ del intent y 
    			 * lo mostramos en el ImageView
    			 */
    			if (data.hasExtra("data")) { 
    				ImageView iv = (ImageView)findViewById(R.id.imgView);
    				iv.setImageBitmap((Bitmap) data.getParcelableExtra("data"));
    			}
    			sendfile=false;
    		/**
    		 * De lo contrario es una imagen completa
    		 */    			
    		} else {
    			/**
    			 * A partir del nombre del archivo ya definido lo buscamos y creamos el bitmap
    			 * para el ImageView
    			 */
    			ImageView iv = (ImageView)findViewById(R.id.imgView);
    			iv.setImageBitmap(BitmapFactory.decodeFile(fileUri.getPath()));
    			/**
    			 * Para guardar la imagen en la galer’a, utilizamos una conexi—n a un MediaScanner
    			 */
    			new MediaScannerConnectionClient() {
    				private MediaScannerConnection msc = null; {
    					msc = new MediaScannerConnection(getApplicationContext(), this); msc.connect();
    				}
    				public void onMediaScannerConnected() { 
    					msc.scanFile(fileUri.getPath(), null);
    				}
    				public void onScanCompleted(String path, Uri uri) { 
    					msc.disconnect();
    				} 
    			};	
    			_path = fileUri.getPath();
    			sendfile =true;
    		}
    	/**
    	 * Recibimos el URI de la imagen y construimos un Bitmap a partir de un stream de Bytes
    	 */
    	} else if (requestCode == SELECT_PICTURE){
    		fileUri = data.getData();
    		InputStream is;
    		try {
    			is = getContentResolver().openInputStream(fileUri);
    	    	BufferedInputStream bis = new BufferedInputStream(is);
    	    	Bitmap bitmap = BitmapFactory.decodeStream(bis);            
    	    	ImageView iv = (ImageView)findViewById(R.id.imgView);
    	    	iv.setImageBitmap(bitmap);		
    	    	is.close();
    	    	sendfile=true;
    	    	_path = this.getPath(fileUri);
    		} catch (FileNotFoundException e) {
    			sendfile=false;
    			e.printStackTrace();
    		} catch (IOException e) {
				sendfile=false;
				e.printStackTrace();
			}
    	}
    }
    
    

    
    public void StoreImage(Context mContext) {
		//StringBuffer sb =new StringBuffer();
        try {
        	
        	File imagefile = new File(_path); 
        	byte[] data = new byte[(int) imagefile.length()];
        	FileInputStream fis = new FileInputStream(imagefile);
        	fis.read(data);
            
            SendFile(imagefile.getName(),data);  // enviando foto
            
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
	
	private void SendFile(final String filename,final byte bytes[] ) {
		
        
        progressDialog = ProgressDialog.show(Camera.this, "",
				"Por favor espere mientras se envian los datos...", true);

		new Thread(new Runnable() {
			public void run() {
				TelephonyManager tm = (TelephonyManager) Camera.this.getSystemService(Context.TELEPHONY_SERVICE);
		        String imei = tm.getDeviceId();
				SendPhoto conn = new SendPhoto(
						"http://siscos.fcr.com.co:8080/movilidad/SrvGetFile",bytes,filename,imei);
				Message msg = progressHandler.obtainMessage();
				msg.obj = conn.Send(orden);
				progressHandler.sendMessage(msg);
			}
		}).start();
	}
	
	

	private static Uri getOutputMediaFileUri(int type){
	      return Uri.fromFile(getOutputMediaFile(type));
	}
	
	private static File getOutputMediaFile(int type){
	    // To be safe, you should check that the SDCard is mounted
	    // using Environment.getExternalStorageState() before doing this.

	    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
	              Environment.DIRECTORY_PICTURES), "GOrden");
	    // This location works best if you want the created images to be shared
	    // between applications and persist after your app has been uninstalled.

	    // Create the storage directory if it does not exist
	    if (! mediaStorageDir.exists()){
	        if (! mediaStorageDir.mkdirs()){
	            Log.d("GOrden", "failed to create directory");
	            return null;
	        }
	    }

	    // Create a media file name
	    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
	    File mediaFile;
	    if (type == MEDIA_TYPE_IMAGE){
	        mediaFile = new File(mediaStorageDir.getPath() + File.separator +
	        "IMG_"+ timeStamp + ".jpg");
	    } else if(type == MEDIA_TYPE_VIDEO) {
	        mediaFile = new File(mediaStorageDir.getPath() + File.separator +
	        "VID_"+ timeStamp + ".mp4");
	    } else {
	        return null;
	    }

	    return mediaFile;
	}
    
	private String getPath(Uri uri) {
		 String[] projection = { android.provider.MediaStore.Images.Media.DATA };
		 Cursor cursor = managedQuery(uri, projection, null, null, null);
		 int column_index = cursor.getColumnIndexOrThrow(android.provider.MediaStore.Images.Media.DATA);
		 cursor.moveToFirst();
		 return cursor.getString(column_index);
		   }
	private void ShowMensaje(String data) {
		if (data.equals("OK")) {
			Toast toast = Toast.makeText(getApplicationContext(), data, Toast.LENGTH_LONG);
			toast.show();
			finish();
		} else { // error al confirmar la orden
			AlertDialog alert =  (AlertDialog) this.crearDialogoAlerta(data);
			alert.show();
		}
		

	}
	
	private Dialog crearDialogoAlerta(String mensaje) {
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setTitle("Informacion");
		builder.setMessage(mensaje);
		builder.setCancelable(false);
		builder.setPositiveButton("OK", new android.content.DialogInterface.OnClickListener() {
			
			public void onClick(DialogInterface dialog, int which) {
				// TODO Auto-generated method stub
				dialog.cancel();
			}
		});		
		return builder.create();
	}
	
	
	
	
}